Django তে Pagination এবং Filtering ব্যবহারকারীদের জন্য একটি বড় ডেটাসেট বা তথ্যকে সহজে এবং দ্রুত ব্রাউজ করার সুবিধা প্রদান করে। Pagination ব্যবহার করে আপনি দীর্ঘ লিস্ট বা ডেটাবেস রেকর্ডগুলো পৃষ্ঠাভিত্তিক (page-based) প্রদর্শন করতে পারেন, এবং Filtering এর মাধ্যমে আপনি নির্দিষ্ট শর্ত বা কন্ডিশন অনুসারে ডেটা খুঁজে বের করতে পারেন। Django তে এই ফিচারগুলোকে সহজভাবে পরিচালনা করার জন্য বিল্ট-ইন সাপোর্ট রয়েছে।
Django Pagination
Pagination ব্যবহার করলে আপনি বড় লিস্টগুলোকে একাধিক ছোট পৃষ্ঠায় ভাগ করতে পারেন। এটি ব্যবহারকারীদের দ্রুত নির্দিষ্ট তথ্য খুঁজে পেতে সাহায্য করে।
১. Pagination সেটআপ
Django তে Pagination ব্যবহারের জন্য, প্রথমে Paginator ক্লাস এবং Page ক্লাস ব্যবহার করতে হয়। সাধারণত, এটি আপনার ভিউ ফাংশনের মধ্যে কনফিগার করা হয়।
from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all() # সব পোস্ট নেয়া
paginator = Paginator(posts, 10) # প্রতি পৃষ্ঠায় ১০টি পোস্ট
page_number = request.GET.get('page') # URL থেকে পৃষ্ঠার নম্বর নেয়া
page_obj = paginator.get_page(page_number) # পৃষ্ঠা অনুযায়ী ফলাফল পাওয়া
return render(request, 'post_list.html', {'page_obj': page_obj})
এখানে:
Paginator: ডেটা (যেমনPost.objects.all()) এবং প্রতি পৃষ্ঠায় প্রদর্শিত আইটেমের সংখ্যা নির্ধারণ করে।get_page(): পৃষ্ঠার নম্বর অনুযায়ী ডেটা ফেরত দেয়।
২. HTML টেমপ্লেটে Pagination রেন্ডার করা
Pagination রেন্ডার করার জন্য HTML টেমপ্লেটে page_obj ব্যবহার করে পূর্ববর্তী এবং পরবর্তী পৃষ্ঠাগুলোর জন্য লিঙ্ক তৈরি করতে হবে।
<!-- post_list.html -->
<ul>
{% for post in page_obj %}
<li>{{ post.title }}</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
এখানে:
page_obj.has_previousএবংpage_obj.has_next: পূর্ববর্তী এবং পরবর্তী পৃষ্ঠার লিঙ্ক প্রদর্শন করতে সাহায্য করে।page_obj.number: বর্তমানে থাকা পৃষ্ঠার নম্বর।page_obj.paginator.num_pages: মোট পৃষ্ঠার সংখ্যা।
Django Filtering
Django তে Filtering ব্যবহার করে আপনি ডেটাবেস থেকে নির্দিষ্ট শর্তের উপর ভিত্তি করে তথ্য খুঁজে বের করতে পারেন। Django ORM এ বিভিন্ন ধরনের ফিল্টারিং পদ্ধতি রয়েছে, যেমন filter(), exclude(), get() ইত্যাদি।
১. Basic Filtering
উদাহরণস্বরূপ, Post মডেলে কিছু ফিল্টারিং করতে:
from django.shortcuts import render
from .models import Post
def filtered_posts(request):
# নামের মধ্যে 'Python' শব্দ থাকা পোস্টগুলি খুঁজে বের করা
posts = Post.objects.filter(title__icontains='Python')
return render(request, 'filtered_posts.html', {'posts': posts})
এখানে:
filter(): একটি ফিল্টারিং মেথড যা নির্দিষ্ট শর্ত অনুযায়ী ডেটা রিটার্ন করে।icontains: এটি একটি ইনক্লুড শর্ত যা অক্ষরের মেলবন্ধন অনুসন্ধান করে, এবং এটি বড় হাতের / ছোট হাতের ক্ষেত্রে অসংবেদনশীল (case-insensitive)।
২. Multiple Filtering
আপনি একাধিক শর্তে ডেটা ফিল্টার করতে পারেন। যেমন, একাধিক শর্তে filter() মেথড ব্যবহার করা:
def filter_by_date_and_title(request):
posts = Post.objects.filter(title__icontains='Django', created_at__year=2023)
return render(request, 'filtered_posts.html', {'posts': posts})
এখানে:
created_at__year=2023: ২০২৩ সালে তৈরি হওয়া পোস্টগুলিকে ফিল্টার করছে।
৩. Filter using GET Parameters
URL প্যারামিটার ব্যবহার করে আপনি ইউজারের ইনপুটের উপর ভিত্তি করে ডেটা ফিল্টার করতে পারেন। উদাহরণস্বরূপ, ইউজার যদি পোস্টের ক্যাটাগরি এবং তারিখ চায়:
def filter_posts_by_category(request):
category = request.GET.get('category')
date = request.GET.get('date')
posts = Post.objects.all()
if category:
posts = posts.filter(category__name=category)
if date:
posts = posts.filter(created_at__year=date)
return render(request, 'filtered_posts.html', {'posts': posts})
এখানে:
request.GET.get('parameter'): URL প্যারামিটার থেকে মান সংগ্রহ করা হচ্ছে।
৪. Django Filter Library ব্যবহার
Django তে Django-filter লাইব্রেরি ব্যবহার করে আরও উন্নত ফিল্টারিং করা যায়। এটি ফিল্টার ফর্ম তৈরি করে এবং ইউজারদের কাছে বিভিন্ন অপশন সরবরাহ করে।
প্রথমে, django-filter ইনস্টল করতে হবে:
pip install django-filter
এরপর ফিল্টার ক্লাস তৈরি করুন:
import django_filters
from .models import Post
class PostFilter(django_filters.FilterSet):
title = django_filters.CharFilter(lookup_expr='icontains')
created_at = django_filters.DateFilter(lookup_expr='year')
class Meta:
model = Post
fields = ['title', 'created_at']
এখন, ফিল্টার ফর্মটি ভিউতে ব্যবহার করুন:
from django.shortcuts import render
from .models import Post
from .filters import PostFilter
def post_list(request):
post_filter = PostFilter(request.GET, queryset=Post.objects.all())
return render(request, 'post_list.html', {'filter': post_filter})
এখানে:
PostFilter:Postমডেলের উপর ফিল্টার অপশন প্রদান করে।request.GET: ইউজারের ইনপুট থেকে ফিল্টার করা।
সারাংশ
Django তে Pagination এবং Filtering আপনার অ্যাপ্লিকেশনকে আরো ইউজার-ফ্রেন্ডলি করে তোলে, কারণ এই দুটি ফিচার আপনার ডেটা প্রদর্শন এবং অনুসন্ধান প্রক্রিয়াকে সহজ এবং কার্যকরী করে তোলে। Pagination বড় ডেটাসেটকে ছোট পৃষ্ঠায় ভাগ করে দেখাতে সাহায্য করে, এবং Filtering ব্যবহারকারীদের নির্দিষ্ট শর্ত অনুযায়ী ডেটা খুঁজে বের করতে সহায়তা করে। Django এ এই কাজগুলো সম্পন্ন করা খুবই সহজ এবং এই ফিচারগুলোকে ইফেকটিভভাবে ব্যবহার করার জন্য আপনি প্রয়োজনীয় কোডগুলো ডেভেলপমেন্টে যোগ করতে পারেন।
Django এর Pagination সিস্টেম ব্যবহার করে আপনি বড় বড় ডেটাসেট বা লিস্টগুলোকে পৃষ্ঠায় বিভক্ত করতে পারেন, যাতে ওয়েব পেজের লোডিং টাইম দ্রুত হয় এবং ইউজারের জন্য ডেটা সহজে অ্যাক্সেসযোগ্য হয়। এটি সাধারণত ব্লগ পেজ, প্রোডাক্ট লিস্ট, বা অন্যান্য দীর্ঘ লিস্টে ব্যবহৃত হয়।
Django তে Pagination সহজেই ব্যবহার করা যায়, কারণ এটি একটি বিল্ট-ইন ফিচার সরবরাহ করে যা আপনাকে বড় ডেটা সেটকে ছোট ছোট অংশে ভাগ করে ব্যবহারকারীদের কাছে প্রদর্শন করতে সাহায্য করে।
Django Pagination কনফিগারেশন
১. ভিউ ফাংশনে Pagination যোগ করা
Django তে Pagination ব্যবহারের জন্য প্রথমে আপনাকে ভিউ ফাংশনে পৃষ্ঠায় বিভক্ত করার জন্য Paginator এবং Page ক্লাস ব্যবহার করতে হবে। এই ক্লাস দুটি Django এর django.core.paginator মডিউল থেকে ইমপোর্ট করা যায়।
এখন একটি উদাহরণ দেখি, যেখানে আমরা একটি তালিকা বা ব্লগ পোস্ট পৃষ্ঠা পৃষ্ঠায় বিভক্ত করব।
from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all() # সব পোস্ট নিয়ে আসুন
paginator = Paginator(posts, 5) # প্রতি পৃষ্ঠায় 5টি পোস্ট দেখানো হবে
page_number = request.GET.get('page') # URL থেকে পেজ নম্বর পাওয়া
page_obj = paginator.get_page(page_number) # পৃষ্ঠার পোস্টগুলি
return render(request, 'post_list.html', {'page_obj': page_obj})
এখানে:
Paginator(posts, 5): এটিPostমডেল থেকে সব পোস্ট নেয় এবং প্রতি পৃষ্ঠায় 5টি পোস্ট দেখানোর জন্য পৃষ্ঠাগুলিতে বিভক্ত করে।request.GET.get('page'): এটি URL থেকে পৃষ্ঠার নম্বর নেয়। উদাহরণস্বরূপ, যদি ইউজার/page/2/পৃষ্ঠা URLটি ব্যবহার করে, তাহলে এটি2পৃষ্ঠার নম্বর ফেরত দেবে।paginator.get_page(page_number): এটি বর্তমান পৃষ্ঠার পোস্টগুলির তালিকা প্রদান করবে।
২. HTML টেমপ্লেটে Pagination দেখানো
এখন, আপনি post_list.html টেমপ্লেট ফাইলে পৃষ্ঠাগুলির লিঙ্কগুলো দেখাতে পারেন, যাতে ব্যবহারকারী পরবর্তী বা পূর্ববর্তী পৃষ্ঠায় যেতে পারেন।
<!-- post_list.html -->
{% for post in page_obj %}
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
এখানে:
page_obj.has_previous: চেক করা হচ্ছে যে, পূর্ববর্তী পৃষ্ঠা আছে কি না। যদি থাকে, তাহলেpreviousলিঙ্কটি দেখানো হবে।page_obj.has_next: চেক করা হচ্ছে যে, পরবর্তী পৃষ্ঠা আছে কি না। যদি থাকে, তাহলেnextলিঙ্কটি দেখানো হবে।page_obj.number: এটি বর্তমান পৃষ্ঠার নম্বর দেখায়।page_obj.paginator.num_pages: এটি মোট পৃষ্ঠার সংখ্যা দেখায়।
৩. পৃষ্ঠার নম্বর নির্ধারণ
এছাড়া, আপনি পৃষ্ঠার মধ্যে কতটি আইটেম দেখতে চান, তা নির্ধারণ করার জন্য per_page পরামিতি ব্যবহার করতে পারেন। যেমন, প্রতি পৃষ্ঠায় 10টি আইটেম দেখানো।
paginator = Paginator(posts, 10) # প্রতি পৃষ্ঠায় 10টি পোস্ট দেখানো হবে
এটি আপনার পৃষ্ঠায় 10টি আইটেম করে দেখাবে এবং পৃষ্ঠাগুলিতে বিভক্ত হবে।
৪. অতিরিক্ত: ডিফল্ট পৃষ্ঠা সেট করা
পৃষ্ঠার নম্বর যদি নির্দিষ্ট না থাকে, তবে Django ডিফল্টভাবে প্রথম পৃষ্ঠা দেখাবে। আপনি যদি চান যে, কোনও নির্দিষ্ট পৃষ্ঠা ডিফল্ট হিসেবে দেখানো হোক, তাহলে সেটিও করতে পারেন। উদাহরণস্বরূপ:
page_number = request.GET.get('page', 1) # যদি পেজ নম্বর না থাকে তবে ১ নাম্বার পৃষ্ঠা দেখাবে
এটি যদি URL থেকে কোনও পৃষ্ঠার নম্বর না পাওয়া যায়, তবে ডিফল্টভাবে প্রথম পৃষ্ঠা (১) দেখাবে।
উপসংহার
Django এর Pagination সিস্টেম ব্যবহার করে আপনি সহজেই বড় ডেটাসেটগুলিকে পৃষ্ঠায় বিভক্ত করতে পারেন এবং ব্যবহারকারীদের জন্য একটি নির্দিষ্ট সংখ্যক আইটেম একসাথে দেখাতে পারেন। Django এর বিল্ট-ইন Paginator এবং Page ক্লাস গুলি এই কাজকে সহজ করে তোলে এবং আপনার অ্যাপ্লিকেশনের পারফর্মেন্স বৃদ্ধি করতে সাহায্য করে।
Django তে QuerySets পেজিনেট করা একটি সাধারণ প্রক্রিয়া যা ব্যবহারকারীদের জন্য বড় ডেটা সেটগুলি সহজে এবং দ্রুত দেখানোর জন্য ব্যবহৃত হয়। পেজিনেশন আপনাকে ডেটাকে ছোট ছোট ভাগে বিভক্ত করতে সাহায্য করে, যাতে ব্যবহারকারী খুব সহজে একে একে পরবর্তী বা পূর্ববর্তী পৃষ্ঠায় নেভিগেট করতে পারে।
Django তে পেজিনেশন করার জন্য Paginator ক্লাস এবং Page অবজেক্ট ব্যবহৃত হয়। আপনি পেজিনেশনকে আপনার ভিউ এবং টেমপ্লেটের মধ্যে সহজেই ইন্টিগ্রেট করতে পারেন।
QuerySets পেজিনেট করার ধাপ
১. Paginator এবং Page ক্লাস ব্যবহার করা
Django তে QuerySet পেজিনেট করতে, প্রথমে Paginator ক্লাস ব্যবহার করতে হয়, তারপর এটি থেকে একটি Page অবজেক্ট তৈরি করতে হয়। এই অবজেক্টটি আপনাকে প্রয়োজনীয় পেজ এবং তার ডেটা প্রদান করবে।
from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Item
def item_list(request):
item_list = Item.objects.all() # সমস্ত আইটেম নিয়ে আসা
paginator = Paginator(item_list, 10) # প্রতি পৃষ্ঠায় 10টি আইটেম
page_number = request.GET.get('page') # URL থেকে পেজ নাম্বার নেয়া
page_obj = paginator.get_page(page_number) # নির্দিষ্ট পৃষ্ঠার অবজেক্ট
return render(request, 'item_list.html', {'page_obj': page_obj})
এখানে:
item_list: সমস্ত আইটেম নিয়ে আসা হচ্ছে।Paginator: এখানে প্রতি পৃষ্ঠায় ১০টি আইটেম দেখানো হবে।get_page(page_number): URL থেকেpageপ্যারামিটার গ্রহণ করে, সঠিক পৃষ্ঠা অবজেক্টটি ফেরত দেয়।
২. টেমপ্লেট ব্যবহার করে পেজিনেশন প্রদর্শন
এখন, আপনি টেমপ্লেট ফাইলে পেজিনেশন এবং পৃষ্ঠার জন্য প্রয়োজনীয় নেভিগেশন লিঙ্কগুলো প্রদর্শন করতে পারেন।
{% for item in page_obj %}
<p>{{ item.name }}</p>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
এখানে:
page_obj: এটিPaginatorথেকে পাওয়া পেজ অবজেক্ট, যার মধ্যে রয়েছে পেজের ডেটা এবং অন্যান্য পেজিনেশন সম্পর্কিত তথ্য।has_previousএবংhas_next: এই ফিল্ডগুলি চেক করে যে, পৃষ্ঠার আগের বা পরের পৃষ্ঠাটি রয়েছে কিনা।previous_page_numberএবংnext_page_number: এগুলো আগের এবং পরবর্তী পৃষ্ঠার নাম্বার দেয়।
৩. পেজিনেশন সম্পর্কিত অতিরিক্ত ফিচার
num_pages: মোট কতটি পৃষ্ঠা রয়েছে তা জানতে এই প্রপার্টি ব্যবহার করা হয়।start_indexএবংend_index: এগুলি বর্তমানে প্রদর্শিত আইটেমগুলির সূচনা এবং শেষ ইনডেক্স দেয়।
<p>Displaying items {{ page_obj.start_index }} to {{ page_obj.end_index }} of {{ page_obj.paginator.count }} items.</p>
paginator.count: মোট ডেটার সংখ্যা যা পেজিনেট করা হয়েছে।
Django তে QuerySet পেজিনেট করার সুবিধা
- ব্যবহারকারী অভিজ্ঞতা উন্নত করা: পেজিনেশন ব্যবহারকারীদের জন্য ডেটা ছোট অংশে ভাগ করে সহজে নেভিগেট করতে সাহায্য করে।
- পারফর্ম্যান্স বৃদ্ধি: পুরো ডেটাসেট একসাথে লোড না করে, পেজিনেশন ডেটা লোডের সময় এবং রিসোর্সের ব্যবহার কমায়।
- স্বচ্ছতা: বড় ডেটাসেটের মধ্যে তথ্য খুঁজে পাওয়া সহজ হয়।
এভাবে Django তে QuerySets পেজিনেট করা যায়। পেজিনেশন আপনাকে বড় ডেটাসেটকে সহজে ম্যানেজ করতে এবং ব্যবহারকারীর জন্য আরও উন্নত অভিজ্ঞতা তৈরি করতে সাহায্য করে।
Django তে Custom Filtering Logic ব্যবহার করা হয় যখন আপনি ডাটাবেস থেকে নির্দিষ্ট ধরনের ডেটা নির্বাচন করতে চান যা Django এর সাধারণ QuerySet ফিল্টারিংয়ের বাইরে। Django এর ORM (Object-Relational Mapping) এর মাধ্যমে আপনি সাধারণভাবে ফিল্টার করতে পারেন, তবে অনেক সময় আপনার নিজস্ব লজিক প্রয়োগ করার প্রয়োজন হতে পারে। এই ক্ষেত্রে, আপনি custom filters তৈরি করতে পারেন যেগুলো ডাটাবেসের query প্রসেসে ব্যবহার হবে।
Custom Filter কীভাবে কাজ করে?
Django তে custom filtering সাধারণত QuerySet API এর মাধ্যমে করা হয়, যেখানে আপনি নিজের কাস্টম লজিক প্রয়োগ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার একটি মডেল থাকে এবং আপনি চান যে নির্দিষ্ট ধরনের ডেটা বের করার জন্য আপনি কিছু কাস্টম লজিক প্রয়োগ করবেন, তবে Django তে manager অথবা custom queryset methods ব্যবহার করতে পারেন।
এখানে একটি বিস্তারিত উদাহরণ দেওয়া হলো, যেখানে custom filtering logic যোগ করা হচ্ছে:
১. Custom Manager তৈরি করা
প্রথমত, আপনি custom manager ব্যবহার করতে পারেন, যা আপনাকে একাধিক custom queryset methods তৈরি করতে সাহায্য করবে।
উদাহরণ: Product মডেল এবং Custom Manager
# models.py
from django.db import models
class ProductManager(models.Manager):
def available(self):
return self.filter(available=True)
def by_category(self, category_name):
return self.filter(category__name=category_name)
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
available = models.BooleanField(default=True)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
objects = ProductManager() # Custom Manager অ্যাসাইন করা
def __str__(self):
return self.name
এখানে, ProductManager একটি custom manager তৈরি করেছে, যার দুটি মেথড রয়েছে:
available(): যা কেবলমাত্র উপলব্ধ পণ্য (available=True) ফেরত দেয়।by_category(): যা একটি নির্দিষ্ট category এর পণ্য ফিরিয়ে দেয়।
২. Custom QuerySet Method তৈরি করা
আপনি চাইলে custom queryset method এর মাধ্যমে আরও কাস্টম লজিক তৈরি করতে পারেন। নিচে এর উদাহরণ দেওয়া হলো:
# models.py
from django.db import models
class ProductQuerySet(models.QuerySet):
def available(self):
return self.filter(available=True)
def by_category(self, category_name):
return self.filter(category__name=category_name)
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
available = models.BooleanField(default=True)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
objects = ProductQuerySet.as_manager() # Custom QuerySet অ্যাসাইন করা
def __str__(self):
return self.name
এখানে, ProductQuerySet হল একটি কাস্টম QuerySet, যেখানে আপনার কাস্টম মেথডগুলো থাকবে (যেমন available() এবং by_category())। as_manager() মেথডটি ব্যবহৃত হয়েছে যাতে এই কাস্টম queryset মেথডগুলো Product মডেলটির জন্য ব্যবহৃত হয়।
৩. Views এ Custom Filtering Logic ব্যবহার করা
আপনি যখন views এ গিয়ে এই কাস্টম ফিল্টার ব্যবহার করতে চান, তখন সরাসরি objects ম্যানেজার বা কাস্টম queryset মেথড ব্যবহার করতে পারেন।
উদাহরণ: Views এ Custom Filter ব্যবহার করা
# views.py
from django.shortcuts import render
from .models import Product
def product_list(request):
# Example of using custom filter by category
products = Product.objects.by_category('Electronics')
return render(request, 'product_list.html', {'products': products})
এখানে, Product.objects.by_category('Electronics') এর মাধ্যমে আপনি কাস্টম ফিল্টার ব্যবহার করে "Electronics" ক্যাটাগরির পণ্যগুলো ফিল্টার করে এনেছেন।
৪. ফর্মের মাধ্যমে Custom Filtering
আপনি চাইলে ইউজারের ইনপুটের মাধ্যমে কাস্টম ফিল্টার তৈরি করতে পারেন। উদাহরণস্বরূপ, একটি ফর্ম ব্যবহার করে নির্দিষ্ট ক্যাটাগরি বা মূল্য পরিসীমার মধ্যে পণ্য ফিল্টার করতে পারবেন।
উদাহরণ: ফর্মের মাধ্যমে Custom Filter
# forms.py
from django import forms
class ProductFilterForm(forms.Form):
category = forms.CharField(max_length=100, required=False)
price_min = forms.DecimalField(min_value=0, required=False)
price_max = forms.DecimalField(min_value=0, required=False)
এখন, এই ফর্মটির মাধ্যমে ফিল্টার করা যাবে:
# views.py
from django.shortcuts import render
from .models import Product
from .forms import ProductFilterForm
def product_list(request):
form = ProductFilterForm(request.GET)
products = Product.objects.all()
if form.is_valid():
category = form.cleaned_data.get('category')
price_min = form.cleaned_data.get('price_min')
price_max = form.cleaned_data.get('price_max')
if category:
products = products.by_category(category)
if price_min:
products = products.filter(price__gte=price_min)
if price_max:
products = products.filter(price__lte=price_max)
return render(request, 'product_list.html', {'products': products, 'form': form})
এখানে:
- ফর্মের মাধ্যমে ইউজার ক্যাটাগরি এবং মূল্য পরিসীমা নির্দিষ্ট করতে পারবেন।
- ফর্মটি সাবমিট করার পর,
Productমডেলটি কাস্টম ফিল্টার (যেমনby_category(),price__gte,price__lte) প্রয়োগ করবে।
৫. Django Filters লাইব্রেরি ব্যবহার
Django তে custom filtering লজিক সহজে ব্যবহার করার জন্য django-filter লাইব্রেরি ব্যবহার করা যেতে পারে। এটি আপনাকে ফিল্টারিং লজিক কাস্টমাইজ করতে এবং পরিষ্কারভাবে সাজাতে সাহায্য করে।
উদাহরণ: Django Filters লাইব্রেরি ব্যবহার
প্রথমে, django-filter লাইব্রেরি ইনস্টল করতে হবে:
pip install django-filter
এরপর, আপনি FilterSet তৈরি করতে পারেন:
# filters.py
import django_filters
from .models import Product
class ProductFilter(django_filters.FilterSet):
category = django_filters.CharFilter(field_name='category__name', lookup_expr='icontains')
price_min = django_filters.NumberFilter(field_name='price', lookup_expr='gte')
price_max = django_filters.NumberFilter(field_name='price', lookup_expr='lte')
class Meta:
model = Product
fields = ['category', 'price_min', 'price_max']
এখন, আপনি views.py তে এই ফিল্টারটি ব্যবহার করতে পারেন:
# views.py
from django.shortcuts import render
from .models import Product
from .filters import ProductFilter
def product_list(request):
product_filter = ProductFilter(request.GET, queryset=Product.objects.all())
return render(request, 'product_list.html', {'filter': product_filter})
এভাবে, Django Filters লাইব্রেরি ব্যবহার করে আপনি আরও সুগম এবং সহজে কাস্টম ফিল্টার লজিক তৈরি করতে পারেন।
সারাংশ
- Custom filtering Django তে একটি শক্তিশালী উপায় যার মাধ্যমে আপনি ডেটাবেসের query প্রসেসে নিজস্ব লজিক প্রয়োগ করতে পারেন।
- আপনি custom managers এবং custom queryset methods ব্যবহার করে ফিল্টার তৈরি করতে পারেন।
- Django তে django-filter লাইব্রেরি ব্যবহার করলে কাস্টম ফিল্টারিং আরও সহজ এবং পরিষ্কারভাবে করা যায়।
Django তে pagination ব্যবহার করে আপনি অনেক ডেটার মধ্যে থেকে একটি নির্দিষ্ট সংখ্যক আইটেম একবারে প্রদর্শন করতে পারেন, যেমন ব্লগ পোস্ট, প্রোডাক্ট তালিকা বা কোনো বড় ডেটাবেস থেকে আংশিক ডেটা দেখানো। Pagination এর মাধ্যমে আপনার অ্যাপ্লিকেশন আরও ব্যবহারে সুবিধাজনক এবং দ্রুত হয়ে ওঠে।
এখানে, আমরা Django Pagination UI তৈরি এবং ব্যবহারের নিয়ম নিয়ে আলোচনা করব।
Pagination কী?
Pagination হল একটি পদ্ধতি যার মাধ্যমে বড় বড় ডেটা সেটগুলোকে ছোট ছোট পৃষ্ঠায় ভাগ করা হয়, যাতে ব্যবহারকারীরা সহজে নেভিগেট করতে পারে। উদাহরণস্বরূপ, একটি ব্লগের ১০০টি পোস্টের মধ্যে ১০টি পোস্ট প্রতি পৃষ্ঠায় দেখানো হয়, এবং ব্যবহারকারী পরবর্তী পৃষ্ঠায় যেতে পারে।
Pagination UI তৈরি করার ধাপ
১. View-এ Pagination যুক্ত করা
প্রথমে, Django তে Pagination কাজ করার জন্য আপনাকে Paginator এবং Page ক্লাস ব্যবহার করতে হবে। Paginator ক্লাস ডেটা সেটকে বিভক্ত করে এবং Page ক্লাস ব্যবহারকারীর কাছে পৃষ্ঠার তথ্য প্রদান করে।
ধরা যাক, আপনার কাছে একটি ব্লগ পোস্টের মডেল রয়েছে এবং আপনি তা pagination সহ প্রদর্শন করতে চান।
models.py:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
views.py:
from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all() # সব ব্লগ পোস্ট নিয়ে আসা
paginator = Paginator(posts, 5) # প্রতি পৃষ্ঠায় 5টি পোস্ট
page_number = request.GET.get('page') # URL থেকে পৃষ্ঠা নম্বর পাওয়া
page_obj = paginator.get_page(page_number) # পৃষ্ঠার ডেটা
return render(request, 'post_list.html', {'page_obj': page_obj})
এখানে, Paginator ক্লাসে প্রথম আর্গুমেন্ট হিসেবে ডেটা (posts) এবং দ্বিতীয় আর্গুমেন্ট হিসেবে প্রতি পৃষ্ঠায় প্রদর্শিত আইটেমের সংখ্যা (৫) উল্লেখ করা হয়েছে। এরপর, get_page() মেথডটি ব্যবহার করে ইউজার যেটি পৃষ্ঠা দেখতে চাচ্ছে, সেই পৃষ্ঠা ডেটা নেওয়া হয়েছে।
২. Template-এ Pagination UI তৈরি করা
এরপর, আপনাকে HTML টেমপ্লেট ফাইলে পৃষ্ঠা নেভিগেশনের UI তৈরি করতে হবে।
post_list.html:
{% for post in page_obj %}
<div class="post">
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
</div>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
এখানে, আমরা page_obj এর মাধ্যমে বর্তমান পৃষ্ঠা নম্বর এবং মোট পৃষ্ঠার সংখ্যা দেখাচ্ছি। ব্যবহারকারীর জন্য প্রথম পৃষ্ঠা, আগের পৃষ্ঠা, পরবর্তী পৃষ্ঠা, এবং শেষ পৃষ্ঠা লিঙ্কগুলি তৈরি করেছি।
page_obj.has_previous: যদি আগের পৃষ্ঠা থাকে, তাহলে প্রথম এবং পূর্ববর্তী পৃষ্ঠায় যাওয়ার লিঙ্ক দেখাবে।page_obj.has_next: যদি পরবর্তী পৃষ্ঠা থাকে, তাহলে পরবর্তী এবং শেষ পৃষ্ঠায় যাওয়ার লিঙ্ক দেখাবে।page_obj.number: বর্তমান পৃষ্ঠার নম্বর।page_obj.paginator.num_pages: মোট পৃষ্ঠার সংখ্যা।
৩. Pagination UI স্টাইলিং
Pagination UI-কে আরও সুন্দরভাবে দেখানোর জন্য আপনি CSS ব্যবহার করতে পারেন। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো:
styles.css:
.pagination {
display: flex;
justify-content: center;
margin-top: 20px;
}
.step-links a, .step-links span {
margin: 0 10px;
text-decoration: none;
}
.step-links .current {
font-weight: bold;
}
এই CSS কোডটি পেজ নেভিগেশনের লিঙ্কগুলোকে কেন্দ্রভূত (centered) করে, এবং পৃষ্ঠা নম্বরের জন্য কিছু স্টাইলিং প্রদান করে।
Pagination এর সুবিধাসমূহ
- পারফরম্যান্স উন্নতি: বড় ডেটা সেটের জন্য pagination ব্যবহারের ফলে শুধুমাত্র প্রয়োজনীয় ডেটা লোড হয়, যা সার্ভারের উপর কম চাপ ফেলে এবং লোড টাইম কমায়।
- ব্যবহারকারী অভিজ্ঞতা: pagination ব্যবহারকারীদের জন্য ডেটা নেভিগেট করা সহজ এবং দ্রুত করে, বিশেষ করে যখন বড় বড় ডেটা তালিকা থাকে।
- ফ্লেক্সিবিলিটি: আপনি বিভিন্ন পরিমাণে ডেটা প্রতি পৃষ্ঠায় প্রদর্শন করতে পারেন, যা বিভিন্ন প্রয়োজনে উপযোগী।
Pagination এর উন্নত বৈশিষ্ট্য
- ডায়নামিক পৃষ্ঠা সংখ্যা: আপনি আরও উন্নত ফিচার যোগ করতে পারেন, যেমন পৃষ্ঠা সংখ্যার পরিবর্তন বা ফিল্টার যোগ করা।
- AJAX Pagination: আপনি AJAX ব্যবহার করে পেজ নেভিগেশন আরো স্মুথ এবং দ্রুত করতে পারেন, যাতে পৃষ্ঠা রিফ্রেশ ছাড়াই নতুন ডেটা লোড হয়।
এইভাবে, Django তে pagination UI তৈরি এবং ব্যবহার করা যায়, যা বড় ডেটা সেটের জন্য ব্যবহারকারীকে আরো সহজে এবং দ্রুত ডেটা অ্যাক্সেস করার সুযোগ দেয়।
Read more